#include <signal.h>
#include <iostream>
using namespace std;

void Print(sigset_t pending)
{
    cout << "当前进程：" << getpid() << "pending:" << endl;
    for (int i = 31; i >= 1; i--)
    {
        // 检查信号编号i是否在pending中
        if (sigismember(&pending, i))
        {
            cout << 1;
        }
        else
        {
            cout << 0;
        }
    }
    cout << endl;
}

void handler(int signo)
{
    cout << "信号递达！" << endl;
    sigset_t pending;
    sigpending(&pending);
    Print(pending);
}

int main()
{
    // 捕捉2号信号
    signal(2, handler);

    // 屏蔽2号信号
    sigset_t set, oldset;
    sigemptyset(&set);
    sigemptyset(&oldset);    // 将信号集初始化为空！
    sigaddset(&set, SIGINT); // 向指定信号集，添加信号

    // 向进程阻塞信号集添加信息，让SIGINT信号被阻塞
    sigprocmask(SIG_BLOCK, &set, &oldset);

    int cnt = 10;
    while (true)
    {
        // 获取当前进程的pending信号集
        sigset_t pending;
        sigpending(&pending);

        // 打印pending信号集
        Print(pending);
        cnt--;

        // 解除对2号信号的阻塞
        if (cnt == 0)
        {
            cout << "解除对2号信号的阻塞\n";
            sigprocmask(SIG_SETMASK, &oldset, &set);
        }

        sleep(1);
    }
}